//c中的不定参宏函数

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include<stdio.h>
#include <stdarg.h>
#include<stdlib.h>




//1.__FILE__(文件名)   ,__LINE__(行号)   
//2.fmt(多个格式化字符串)    __VA_ARGS__(不定参数)   无参：##__VA_ARGS__(如果为空，取消前置,)


#define LOG(fmt,...) printf("[%s::%d]"fmt,__FILE__,__LINE__, ##__VA_ARGS__);



//3.va宏:释放指针，置空指针

//man va_start
void PrintNum(int count,...)//count个参数
{
    va_list ap;
    va_start(ap,count); //取到count后一个参数的地址

    for (int i = 0; i < count; i++)
    {
        int num=va_arg(ap,int);  //一直取后面的参数的值
        printf("序号:[%d]--数值:[%d]\n",i,num); //打印
    }
    va_end(ap); //置空指针

}

//man vasprintf
void myprintf(const char *fmt,...)
{
    va_list ap;  
    char *s;
    va_start(ap,fmt); 

    int n=vasprintf(&s,fmt,ap); //计算好长度存到s中，  如果为空，返回-1 否则返回计算好长度
    if(n!=-1)
    {
        printf(s);
    }
    va_end(ap);
    free(s);


}




int main()
{

    // LOG("%s","学习不定参数\n");  --__VA_ARGS__
     LOG("学习不定参数\n");
     myprintf("kkkk\n");
     PrintNum(3,1,2,3);


    return 0;
}